package com.graduation.check.utils;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 类型转换工具类
 * 用于安全地将数据库查询结果（Long、BigDecimal等）转换为Java基本类型
 * 
 * @author system
 */
public class TypeConverter {
    
    /**
     * 从Map中安全获取Integer值
     * 支持转换：Long、BigDecimal、Integer、String
     * 
     * @param map 数据Map
     * @param key 键名
     * @return Integer值，转换失败或null时返回0
     */
    public static Integer getIntValue(Map<String, Object> map, String key) {
        Object value = map.get(key);
        return convertToInt(value);
    }
    
    /**
     * 从Map中安全获取Integer值（带默认值）
     */
    public static Integer getIntValue(Map<String, Object> map, String key, Integer defaultValue) {
        Object value = map.get(key);
        if (value == null) {
            return defaultValue;
        }
        return convertToInt(value);
    }
    
    /**
     * 从Map中安全获取Long值
     */
    public static Long getLongValue(Map<String, Object> map, String key) {
        Object value = map.get(key);
        return convertToLong(value);
    }
    
    /**
     * 从Map中安全获取Long值（带默认值）
     */
    public static Long getLongValue(Map<String, Object> map, String key, Long defaultValue) {
        Object value = map.get(key);
        if (value == null) {
            return defaultValue;
        }
        return convertToLong(value);
    }
    
    /**
     * 从Map中安全获取Double值
     */
    public static Double getDoubleValue(Map<String, Object> map, String key) {
        Object value = map.get(key);
        return convertToDouble(value);
    }
    
    /**
     * 从Map中安全获取Double值（带默认值）
     */
    public static Double getDoubleValue(Map<String, Object> map, String key, Double defaultValue) {
        Object value = map.get(key);
        if (value == null) {
            return defaultValue;
        }
        return convertToDouble(value);
    }
    
    /**
     * 将Object转换为Integer
     */
    private static Integer convertToInt(Object value) {
        if (value == null) {
            return 0;
        }
        
        // 处理Number类型（Long、BigDecimal、Integer、Short等）
        if (value instanceof Number) {
            return ((Number) value).intValue();
        }
        
        // 处理String类型
        if (value instanceof String) {
            try {
                return Integer.parseInt((String) value);
            } catch (NumberFormatException e) {
                return 0;
            }
        }
        
        return 0;
    }
    
    /**
     * 将Object转换为Long
     */
    private static Long convertToLong(Object value) {
        if (value == null) {
            return 0L;
        }
        
        if (value instanceof Number) {
            return ((Number) value).longValue();
        }
        
        if (value instanceof String) {
            try {
                return Long.parseLong((String) value);
            } catch (NumberFormatException e) {
                return 0L;
            }
        }
        
        return 0L;
    }
    
    /**
     * 将Object转换为Double
     */
    private static Double convertToDouble(Object value) {
        if (value == null) {
            return 0.0;
        }
        
        if (value instanceof Number) {
            return ((Number) value).doubleValue();
        }
        
        if (value instanceof String) {
            try {
                return Double.parseDouble((String) value);
            } catch (NumberFormatException e) {
                return 0.0;
            }
        }
        
        return 0.0;
    }
    
    /**
     * 将Object转换为BigDecimal
     */
    public static BigDecimal convertToBigDecimal(Object value) {
        if (value == null) {
            return BigDecimal.ZERO;
        }
        
        if (value instanceof BigDecimal) {
            return (BigDecimal) value;
        }
        
        if (value instanceof Number) {
            return BigDecimal.valueOf(((Number) value).doubleValue());
        }
        
        if (value instanceof String) {
            try {
                return new BigDecimal((String) value);
            } catch (NumberFormatException e) {
                return BigDecimal.ZERO;
            }
        }
        
        return BigDecimal.ZERO;
    }
}
